
package com.x52im.rbchat.logic.chat_root.sendlocation.impl;

import android.app.Activity;
import android.util.Log;

import com.amap.api.location.AMapLocation;
import com.amap.api.location.AMapLocationClient;
import com.amap.api.location.AMapLocationClientOption;
import com.amap.api.location.AMapLocationListener;
import com.google.gson.Gson;
import com.x52im.rbchat.logic.chat_root.sendlocation.utils.LocationSPUtils;
import com.x52im.rbchat.logic.chat_root.sendlocation.utils.LocationUtils;

/**
 * 获取我自已的当前位置定位的wrapper包装类。
 *
 * <p>
 * 单独提炼出wapper类的目的，仅仅是为了减少它所依附的主类的代码量，
 * 从而提升主类代码的可读性和可维护性，这仅是一种设计模式和技巧，与功能无关。
 * </p>
 *
 * @author xiaofuchen(https://github.com/xiaofuchen/WeixinLocation)
 * @author JackJiang
 * @since 6.0
 */
public abstract class GetMyselfLocationWrapper
{
    private final static String TAG = GetMyselfLocationWrapper.class.getSimpleName();

    private Activity parentActivity = null;

    private AMapLocationClient locationClient = null;
    private AMapLocation location;
    private AMapLocationListener mAMapLocationListener;

    private boolean dontSaveLocation = false;

    public GetMyselfLocationWrapper(Activity parentActivity, boolean dontSaveLocation) {
        this.parentActivity = parentActivity;
        this.dontSaveLocation = dontSaveLocation;

        initListener();
        initLocation();
    }

    /**
     * 初始化定位
     */
    private void initLocation() {
        if (null == locationClient) {
            //初始化client
            locationClient = new AMapLocationClient(parentActivity.getApplicationContext());
            //设置定位参数
            locationClient.setLocationOption(getDefaultOption());
            // 设置定位监听
            locationClient.setLocationListener(mAMapLocationListener);
        }
    }

    private void initListener() {
        // gps定位监听器
        mAMapLocationListener = new AMapLocationListener() {
            @Override
            public void onLocationChanged(AMapLocation loc) {
                try {
                    if (null != loc) {
                        stopLocation();

                        //可在其中解析amapLocation获取相应内容。
                        if (loc.getErrorCode() == 0) {
                            location = loc;

                            if(dontSaveLocation)
                                LocationSPUtils.putString(parentActivity, LocationUtils.LOCATION_INFO, new Gson().toJson(location));

                            whenLocationSucess();
                        } else {
                            //定位失败时，可通过ErrCode（错误码）信息来确定失败的原因，errInfo是错误信息，详见错误码表。
//                            LocationUtils.showLocationError(parentActivity, loc.getErrorCode());
                            Log.e(TAG, "【位置消息】location Error, ErrCode:" + loc.getErrorCode() + ", errInfo:" + loc.getErrorInfo());
                            showHint(LocationUtils.getLocationErrorDesc(loc.getErrorCode()));
                        }
                    }
                    else
                    {
                        showHint("获取位置的过程发生了错误，请稍后再试(loc==null)。");
                    }
                } catch (Exception ex) {
                    Log.w(TAG, ex);
                    showHint("获取位置的过程发生了错误，请稍后再试。");
                }
            }
        };
    }

    protected abstract void whenLocationSucess();

    /**
     * 默认的定位参数
     */
    private AMapLocationClientOption getDefaultOption() {
        AMapLocationClientOption mOption = new AMapLocationClientOption();
        mOption.setLocationMode(AMapLocationClientOption.AMapLocationMode.Hight_Accuracy);//可选，设置定位模式，可选的模式有高精度、仅设备、仅网络。默认为高精度模式
        mOption.setGpsFirst(false);//可选，设置是否gps优先，只在高精度模式下有效。默认关闭
        mOption.setHttpTimeOut(30000);//可选，设置网络请求超时时间。默认为30秒。在仅设备模式下无效
        mOption.setInterval(2000);//可选，设置定位间隔。默认为2秒
        mOption.setNeedAddress(true);//可选，设置是否返回逆地理地址信息。默认是true
        mOption.setOnceLocation(false);//可选，设置是否单次定位。默认是false
        mOption.setOnceLocationLatest(false);//可选，设置是否等待wifi刷新，默认为false.如果设置为true,会自动变为单次定位，持续定位时不要使用
        AMapLocationClientOption.setLocationProtocol(AMapLocationClientOption.AMapLocationProtocol.HTTP);//可选， 设置网络请求的协议。可选HTTP或者HTTPS。默认为HTTP
        mOption.setSensorEnable(false);//可选，设置是否使用传感器。默认是false
        mOption.setWifiScan(true); //可选，设置是否开启wifi扫描。默认为true，如果设置为false会同时停止主动刷新，停止以后完全依赖于系统刷新，定位位置可能存在误差
        mOption.setMockEnable(true);//如果您希望位置被模拟，请通过setMockEnable(true);方法开启允许位置模拟
        return mOption;
    }

    public AMapLocation getCurrentLocation() {
        return this.location;
    }

    /**
     * 开始定位
     */
    public void startLocation() {
        initLocation();
//        // 设置定位参数
//        locationClient.setLocationOption(locationOption);
        // 启动定位
        locationClient.startLocation();
    }

    /**
     * 停止定位
     */
    public void stopLocation() {
        if (null != locationClient) {
            locationClient.stopLocation();
        }
    }

    public void onDestroy() {
        if (locationClient != null)
            locationClient.onDestroy();
    }

    protected abstract void showHint(String hint);
}